package emu.decvices.bus;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 总线
 */
public class BUS implements Serializable {
    private List<BusDevice> devices = new ArrayList<>();
    /**
     * 读取指定地址位置上的字节数据
     * @param address 地址是2字节的
     * @return 返回对应字节上的1字节数据，-1则表示没有任何设备响应读取
     */
    public int read(int address){
        try {
            for (BusDevice device : devices) {
                int d = device.fromDeviceRead(address);
                if (d != -1) {
                    return d&0xFF;
                }
            }
        }catch (Exception e){
            //遍历过程可能出现的异常
            e.printStackTrace();
        }
        return 0;//读取不到字节暂时返回0，先不返回-1给设备，以防出错
    }

    /**
     * 将指定数据写入到指定位置上
     * @param address
     * @param data
     */
    public void write(int address,int data){
        for (BusDevice device : devices) {
            if (device.toDeviceWrite(address, data&0xFF)){
                break;
            }
        }

    }

    /**
     * 向总线上链接一个设备
     * @param device
     */
    public void linkDevice(BusDevice device){
        if(device==null)return;
        device.setBus(this);//设置该设备的总线引用
        devices.add(device);//将该设备保存到当前总线集合中
    }
    /**
     * 将设备连接到总线的第一个设备位置
     * @param device
     */
    public void linkDeviceFirst(BusDevice device){
        if(device==null)return;
        device.setBus(this);//设置该设备的总线引用
        devices.add(0,device);//将该设备保存到当前总线集合中最开始
    }
}
